home *** CD-ROM | disk | FTP | other *** search
/ Aminet 32 / Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso / Aminet / misc / emu / flamingo.lha / Flamingo / sources / ppcaga-delta.asm < prev    next >
Assembly Source File  |  1999-06-17  |  8KB  |  407 lines

  1. ; PPCAGA-Delta
  2. ; External Video Driver for
  3. ; Flaming Plus/4 emulator for the Amiga
  4. ;
  5. ; version 1.0
  6.  
  7.     MACHINE    68020
  8.  
  9.         INCDIR    Include:
  10.  
  11.     INCLUDE exec/types.i
  12.     INCLUDE    exec/memory.i
  13.     INCLUDE    exec/exec_lib.i
  14.     INCLUDE    utility/tagitem.i
  15.     INCLUDE    intuition/intuition.i
  16.     INCLUDE    intuition/intuition_lib.i
  17.     INCLUDE    intuition/screens.i
  18.     INCLUDE    graphics/graphics_lib.i
  19.     INCLUDE graphics/modeid.i
  20.     INCLUDE    graphics/rastport.i
  21.     INCLUDE    macros.i
  22.     INCLUDE    powerpc/powerpc.i
  23.  
  24. ;*** Handler structure
  25.  
  26.  STRUCTURE vxd_handler,0
  27.   LONG intuibase
  28.   LONG graphbase
  29.   LONG powerpcbase
  30.   LONG myscr
  31.   LONG mywin
  32.   LONG planes
  33.   WORD xsize
  34.   WORD ysize
  35.   LONG chunkysize
  36.   LONG planesize
  37.   LONG palette
  38.   LONG palette32
  39.   LONG emuscr1
  40.   LONG emuscr2
  41.   LONG delta
  42.   LONG bytesperrowskip
  43.   LONG wait
  44.  LABEL    vxd_handler_SIZEOF
  45.  
  46. JSRLIB    MACRO
  47.     jsr    _LVO\1(a6)
  48.     ENDM
  49.  
  50. ;*** Let's begin
  51.  
  52.     moveq.l    #0,d0
  53.     rts
  54.  
  55.     dc.b "FLAMINGOXVD"
  56.     dc.b "1"
  57.  
  58.     dc.l Name
  59.     dc.l Author
  60.     dc.w 1
  61.     dc.w 0
  62.  
  63.     dc.l drv_Init
  64.     dc.l drv_Done
  65.     dc.l 0            ;nothing to configure
  66. ;    dc.l drv_Configure
  67.     dc.l drv_OpenScreen
  68.     dc.l drv_CloseScreen
  69.     dc.l drv_Refresh
  70.  
  71. Name:    dc.b    "PPCAGA-Delta External Video Driver",0
  72. Author:    dc.b    "Álmos Rajnai (original C2P by James McCoull & Peter McGavin)",0
  73. powerpclibname:    dc.b    "powerpc.library",0
  74.  
  75.     EVEN
  76.  
  77. ;*** Functions
  78.  
  79. drv_Init:
  80.     movem.l    a0-a1,-(sp)    ;Saving infos
  81.     move.l  4.w,a6        ;Alloc memory for handler
  82.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  83.     move.l    #vxd_handler_SIZEOF,d0
  84.     JSRLIB    AllocVec
  85.     movem.l    (sp)+,a0-a1    ;Recover infos
  86.         tst.l    d0
  87.     beq.b    drv_Init_nomem    ;No mem
  88.     movea.l    d0,a2
  89.         move.l    (a0),graphbase(a2)    ;Saving graphics.library base
  90.         move.l    8(a0),intuibase(a2)    ;Saving intuition.library base
  91.     movem.l    a2,-(sp)
  92.     lea    powerpclibname,a1
  93.     moveq.l    #7,d0
  94.     JSRLIB    OpenLibrary
  95.     movem.l    (sp)+,a2
  96.     move.l    d0,powerpcbase(a2)
  97.     tst.l    d0
  98.     beq.b    drv_Init_nopowerlib
  99.     move.l    a2,d0        ;Give back handler address
  100.     rts
  101.  
  102. drv_Init_nomem:
  103.     moveq.l    #0,d0
  104.     move.l    #err_nomem,d1
  105.     rts
  106.  
  107. drv_Init_nopowerlib:
  108.     move.l    a2,a1
  109.     JSRLIB    FreeVec        ;Deallocate handler
  110.     moveq.l    #0,d0
  111.     move.l    #err_nopowerlib,d1
  112.     rts
  113.  
  114. drv_Done:
  115.     tst.l    a0
  116.     beq.b    .1
  117.     move.l    4.w,a6
  118.     movem.l    a0,-(sp)
  119.     move.l    powerpcbase(a0),a1
  120.     tst.l    a1
  121.     beq.b    .2
  122.     JSRLIB    CloseLibrary
  123. .2    movem.l    (sp)+,a1
  124.     JSRLIB    FreeVec        ;Deallocate handler
  125. .1
  126.     rts
  127.  
  128. ;drv_Configure:        -> Nothing to configure
  129. ;    rts
  130.  
  131. drv_OpenScreen:
  132.     movea.l a0,a5
  133.     move.w    (a1)+,xsize(a5)
  134.     move.w    (a1)+,ysize(a5)
  135.     move.l    (a1)+,palette(a5)
  136.  
  137.     moveq.l    #0,d0
  138.     move.l    d0,d1
  139.     move.w    xsize(a5),d0
  140.     move.w    ysize(a5),d1
  141.     mulu.w    d1,d0
  142.     move.l    d0,chunkysize(a5)
  143.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  144.     move.l    4.w,a6
  145.     JSRLIB    AllocVec
  146.     move.l    d0,emuscr1(a5)        ;allocating emulator screen1
  147.     tst.l    d0
  148.     beq.w    .1
  149.     move.l    chunkysize(a5),d0
  150.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  151.     move.l    4.w,a6
  152.     JSRLIB    AllocVec
  153.     move.l    d0,emuscr2(a5)        ;allocating emulator screen2
  154.     tst.l    d0
  155.     beq.w    .1
  156.  
  157.     move.l    chunkysize(a5),d0
  158.     move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  159.     move.l    4.w,a6
  160.     JSRLIB    AllocVec
  161.     move.l    d0,delta(a5)        ;allocating delta buffer
  162.     tst.l    d0
  163.     beq.w    .1
  164.  
  165.     move.l    #MEMF_PUBLIC,d1
  166.     move.l    #128*3*4+8,d0
  167.     JSRLIB    AllocVec
  168.     move.l    d0,palette32(a5)    ;Convert palette to 32 bit per gun
  169.     beq.w    .1
  170.     movea.l    d0,a0
  171.         move.l    palette(a5),a1
  172.     move.w    #128,(a0)+
  173.     move.w    #$0,(a0)+
  174.     move.l    #128*3-1,d2
  175. .2    moveq.l    #0,d0
  176.     move.b    (a1)+,d0
  177.     swap    d0
  178.     asl.l    #8,d0
  179.     move.l    d0,(a0)+
  180.     dbf    d2,.2
  181.     move.l    #0,(a0)
  182.     move.w    xsize(a5),width+2
  183.     move.w    ysize(a5),height+2
  184.     move.l    palette32(a5),pal
  185.  
  186.         suba.l    a0,a0            ;No newscreen stuct
  187.         lea    scrtags,a1
  188.     movea.l    intuibase(a5),a6
  189.     JSRLIB    OpenScreenTagList
  190.     move.l    d0,myscr(a5)
  191.     beq.w    .1
  192.     move.l    d0,wscr
  193.     move.l    d0,a0
  194.     lea    sc_RastPort(a0),a0
  195.     movea.l    rp_BitMap(a0),a0
  196.     move.l    #BMA_FLAGS,d1
  197.     movea.l    graphbase(a5),a6
  198.     JSRLIB    GetBitMapAttr
  199.     and.l    #BMF_STANDARD,d0
  200.     cmp.l    #BMF_STANDARD,d0
  201.     beq.b    .3
  202.     movea.l    intuibase(a5),a6
  203.     move.l    myscr(a5),a0
  204.     JSRLIB    CloseScreen
  205.     moveq.l    #0,d0
  206.     move.l    d0,myscr(a5)
  207.     bra.b    .1
  208.  
  209. .3    move.w    xsize(a5),wwidth+2
  210.     move.w    ysize(a5),wheight+2
  211.     suba.l    a0,a0
  212.     lea    wintags,a1
  213.     movea.l    intuibase(a5),a6
  214.     JSRLIB    OpenWindowTagList
  215.     move.l    d0,mywin(a5)
  216.     beq.b    .1
  217.     movea.l    d0,a1
  218.     move.l  wd_RPort(a1),a0
  219.     move.l    rp_BitMap(a0),a0
  220.     move.l    bm_Planes(a0),planes(a5)
  221.     moveq.l    #0,d0
  222.     move.w    bm_BytesPerRow(a0),d0
  223.     move.w    xsize(a5),d1
  224.     lsr.w    #3,d1
  225.     sub.w    d1,d0
  226.     move.l    d0,bytesperrowskip(a5)
  227.     move.w    bm_BytesPerRow(a0),d0
  228.     move.w    ysize(a5),d1
  229.     mulu.w    d0,d1
  230.     move.l    d1,planesize(a5)
  231.     move.l  wd_UserPort(a1),d0    ;IDCMP port
  232.     move.l    emuscr1(a5),d2        ;chunky buffer
  233.  
  234. .1    move.l    #err_noscr,d1
  235.     rts
  236.  
  237. drv_CloseScreen:
  238.     move.l    a0,a5
  239.     move.l    mywin(a5),a0
  240.     cmpa.l    #0,a0
  241.     beq.b    .1
  242.  
  243. ; Wait for PPC
  244.     tst.l    wait(a5)
  245.     beq.b    .skip
  246.     clr.l    wait(a5)
  247.  
  248.     lea     -PP_SIZE(sp),sp
  249.     move.l  sp,a0
  250.     move.l  powerpcbase(a5),a6
  251.     jsr     -36(a6)                 ;WaitForPPC
  252.     lea     PP_SIZE(sp),sp
  253. .skip
  254.     move.l    intuibase(a5),a6
  255.     move.l    mywin(a5),a0
  256.     JSRLIB    CloseWindow
  257.  
  258. .1    move.l    myscr(a5),a0
  259.     cmpa.l    #0,a0
  260.     beq.b    .2
  261.     JSRLIB    CloseScreen
  262.  
  263. .2    movea.l    palette32(a5),a1
  264.         cmpa.l    #0,a1
  265.     beq.b    .3
  266.     move.l    4.w,a6
  267.     JSRLIB    FreeVec        ;Deallocate translated palette
  268.  
  269. .3    movea.l    emuscr1(a5),a1
  270.         cmpa.l    #0,a1
  271.     beq.b    .6
  272.     move.l    4.w,a6
  273.     JSRLIB    FreeVec        ;Deallocate chunky buffer
  274.  
  275. .6    movea.l    emuscr2(a5),a1
  276.         cmpa.l    #0,a1
  277.     beq.b    .5
  278.     move.l    4.w,a6
  279.     JSRLIB    FreeVec        ;Deallocate chunky buffer
  280.  
  281. .5    movea.l    delta(a5),a1
  282.         cmpa.l    #0,a1
  283.     beq.b    .4
  284.     move.l    4.w,a6
  285.     JSRLIB    FreeVec        ;Deallocate delta buffer
  286.  
  287. .4    moveq.l    #0,d0
  288.     move.l    d0,emuscr1(a5)    ;They were already freed
  289.     move.l    d0,emuscr2(a5)
  290.     move.l    d0,delta(a5)
  291.     move.l    d0,palette32(a5)
  292.     move.l    d0,myscr(a5)
  293.     move.l    d0,mywin(a5)
  294.  
  295.     rts
  296.  
  297. drv_Refresh:
  298.     move.l    a0,a5
  299.     move.l    powerpcbase(a5),a6    ;powerpc.library base
  300.  
  301. ; Wait for PPC, workaround, don't do the same!
  302.     tst.l    wait(a5)
  303.     beq.b    .skip
  304.     clr.l    wait(a5)
  305.  
  306.     lea     -PP_SIZE(sp),sp
  307.     move.l  sp,a0
  308.     jsr     -36(a6)                 ;WaitForPPC
  309.     lea     PP_SIZE(sp),sp
  310. .skip
  311.     move.l    delta(a5),a0    ;Delta buffer
  312.     move.l    emuscr1(a5),d0    ;Chunky pixels
  313.     move.l    emuscr2(a5),d5    ;Exchange chunky buffers
  314.     move.l    d0,emuscr2(a5)
  315.     move.l    d5,emuscr1(a5)
  316.     movem.l    d5,-(sp)    ;Saving next chunky buffer address
  317.  
  318.     move.l    planes(a5),d1    ;Plane address
  319.     move.l    planesize(a5),a1    ;Size of one plane/8
  320.     move.l    bytesperrowskip(a5),d2
  321.     moveq.l    #0,d3
  322.     move.w    xsize(a5),d3
  323.     move.l    chunkysize(a5),d4
  324.  
  325. ;    RUNPOWERPC c2p_8_ppc ,,PPF_ASYNC    ;Let's go for a ride (asynchron)
  326.  
  327.                 ;Instead of the macro I should use
  328.                 ;direct code for PPC process call
  329.                 ;So this is a workaround, don't do the same!
  330. ;--- snip ---
  331.     move.l    #TRUE,wait(a5)
  332.     lea     -PP_SIZE(sp),sp
  333.     move.l  d0,PP_REGS(sp)
  334.     move.l  d1,PP_REGS+1*4(sp)
  335.     move.l  d2,PP_REGS+2*4(sp)    ;Was not in the macro!
  336.     move.l  d3,PP_REGS+3*4(sp)    ;Was not in the macro!
  337.     move.l  d4,PP_REGS+4*4(sp)    ;Was not in the macro!
  338.     move.l  a0,PP_REGS+8*4(sp)
  339.     move.l  a1,PP_REGS+9*4(sp)
  340.     move.l  sp,a0
  341.  
  342.         XREF    @_c2p_8_ppc        ;c2p routine
  343.  
  344.         move.l    @_c2p_8_ppc,a1
  345.         move.l  a1,PP_CODE(a0)
  346.     clr.l   PP_OFFSET(a0)
  347.         move.l    #PPF_ASYNC,PP_FLAGS(a0)
  348.     clr.l   PP_STACKPTR(a0)
  349.     clr.l   PP_STACKSIZE(a0)
  350.     jsr     -30(a6)            ;RunPPC
  351.     lea     PP_SIZE(sp),sp
  352. ;--- snip ---
  353.  
  354.     movem.l    (sp)+,d0    ;giving back chunky buffer
  355.         rts
  356.  
  357.  
  358. ;*** Constants
  359.  
  360. scrtags:
  361.     dc.l    SA_Width
  362. width:    dc.l    0
  363.     dc.l    SA_Height
  364. height:    dc.l    0
  365.     dc.l    SA_Depth,8
  366.     dc.l    SA_Colors32
  367. pal:    dc.l    0
  368.     dc.l    SA_Title,scrtitle
  369.     dc.l    SA_ShowTitle,FALSE
  370.     dc.l    SA_DisplayID,LORES_KEY
  371.     dc.l    SA_Interleaved,FALSE
  372.     dc.l    SA_Type,CUSTOMSCREEN
  373.     dc.l    SA_AutoScroll,TRUE
  374.     dc.l    SA_Overscan,OSCAN_STANDARD
  375.     dc.l    SA_Quiet,TRUE
  376.     dc.l    TAG_DONE
  377.  
  378. wintags:
  379.     dc.l    WA_Left,0
  380.     dc.l    WA_Top,0
  381.     dc.l    WA_Width
  382. wwidth:    dc.l    0
  383.     dc.l    WA_Height
  384. wheight:    dc.l    0
  385.     dc.l    WA_IDCMP,IDCMP_RAWKEY
  386.     dc.l    WA_Title,0
  387.     dc.l    WA_Backdrop,TRUE
  388.     dc.l    WA_RMBTrap,TRUE
  389.     dc.l    WA_Borderless,TRUE
  390.     dc.l    WA_NoCareRefresh,TRUE
  391.     dc.l    WA_CustomScreen
  392. wscr:    dc.l    0
  393.     dc.l    WA_SimpleRefresh,TRUE
  394.     dc.l    WA_Activate,TRUE
  395.     dc.l    TAG_DONE
  396.  
  397. scrtitle:    dc.b    'Flamingo Plus/4 emulator screen',0
  398. ;*** Errors
  399.  
  400. err_nomem:
  401.     dc.b    'Run out of memory',0
  402. err_noscr:
  403.     dc.b    'Cannot open screen',0
  404. err_nopowerlib:
  405.     dc.b    'Cannot open PowerPC.library',0
  406.  
  407.